/*
 * $Id:
 *
 * Copyright (C) 2011 Refiner Inc.
 * All right reserved
 *
 *============================================================
 * +rVPN Stack : AppIF (Application Interface)
 *============================================================
 * abstract: This module provides rvs socket functions
 * author  : MURATA
 * history :
 *
 */

#ifndef _RVS_APPIF_H_
#define _RVS_APPIF_H_

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/un.h>

#define RVS_MAX_IFSOCK      32
#define RVS_MAX_APPIF		128


/* アドレス格納領域 */
typedef union {
   struct sockaddr    sa;
   struct sockaddr_un saun;
   struct sockaddr_in sain;
}       rvsaddr_t;


/* 設定パラメータ */
typedef struct rvs_config {
    rvsaddr_t staddr;
    int addrlen;
    int init;
    int exit;
} rvs_conf_t;

extern rvs_conf_t rapi_conf;

#ifdef SOCK_SPLIT

//#define MAX_FDS             128   /* Max file descriptor per process */
#define MAX_FDS __FD_SETSIZE   /* Max file descriptor per process */

typedef struct rvs_sock {
  int rvs_sock;
  int sock_sts;
} rvs_socks_t;

/*  sock_sts  */
#define SOCK_NONE    0
#define SOCK_CREATED 1
#define SOCK_VPN     2
#define SOCK_NONVPN  3

#endif  /* SOCK_SPLIT */


#define is_rvsapi_initialized() rapi_conf.init
#define is_rvsapi_exited()      rapi_conf.exit

#ifdef APPIFLOGPATH
#ifndef LOGSTDERR
#define LOGSTDERR
#endif
#endif /* APPIFLOGPATH */

// 2012.02.10 koyama 音質調査
//#include <android/log.h>
//#define LOGXX(fmt, ...) __android_log_print(ANDROID_LOG_DEBUG, "RVPNSDK",fmt, ##__VA_ARGS__)
#define LOGXX(fmt, ...)

#if defined( _DO_LOG_)
#ifdef ANDROIDNDK
#include <android/log.h>
#ifdef LOGSTDERR
#include <stdio.h>
#define LOGD(fmt, ...) {fprintf(stderr, fmt, ##__VA_ARGS__); fflush(stderr);}
#define LOGE(fmt, ...) {fprintf(stderr, fmt, ##__VA_ARGS__); fflush(stderr);}
#else
#define LOGD(fmt, ...) __android_log_print(ANDROID_LOG_DEBUG, "AppIF",fmt, ##__VA_ARGS__)
#define LOGE(fmt, ...) __android_log_print(ANDROID_LOG_ERROR, "AppIF",fmt, ##__VA_ARGS__)
#endif
#else
#include <stdio.h>
#include <stdarg.h>
#include <sys/time.h>
static inline void logprintf(const char*fmt, ...)
{
    va_list ap;
    struct timeval tv;
    gettimeofday(&tv, NULL);
    fprintf (stderr, "%08d: ", (int)tv.tv_usec);
    va_start(ap, fmt);
    vfprintf(stderr, fmt, ap);
    va_end(ap);
}
#define LOGD(fmt, ...) logprintf( fmt, ##__VA_ARGS__)
#define LOGE(fmt, ...) logprintf( fmt, ##__VA_ARGS__)
#endif
#else
#define LOGD(fmt, ...)
#define LOGE(fmt, ...)
#endif

#ifndef INVALID_SOCKET
#define INVALID_SOCKET    (-1)
#endif

#ifdef ANDROIDNDK
#ifdef REGZA
#define RVS_API_SOCK_PATH	"/sqlite_stmt_journals/.rvs_api_sock_unix"
#else
#define RVS_API_SOCK_PATH	"/sdcard/refiner/.rvs_api_sock_unix"
#endif
#else
#define RVS_API_SOCK_PATH	"/tmp/.rvs_api_sock_unix"
#endif
#define RVS_API_SOCK_PORT	12008

#ifdef __cplusplus
extern "C"{
#endif

/* App I/F通信用ソケットの取得 */
int rvs_api_sock(int ns);

/* rvs_api_new - フリーのソケットを割り当てる */
int rvs_api_new(void);

/* rvs_api_free - ソケットを解放する */
void rvs_api_free(int ns);

/* rvs_api_remove - ソケットをクローズする */
void rvs_api_remove(int ns);

#ifdef __cplusplus
}
#endif

#endif /* _RVS_APPIF_H_ */
